//
//  CoordinatorDataSource.h
//  BaseProject
//
//  Created by itzhaolei on 2024/5/15.
//

#import <UIKit/UIKit.h>
#import <IGListDiffKit/IGListDiffable.h>

@class IGListAdapter;
@class CommonSectionAdapter;
@class CommonSectionController;

#ifndef CoordinatorDataSource_h
#define CoordinatorDataSource_h

NS_ASSUME_NONNULL_BEGIN
@protocol CoordinatorDataSource

/**
 Asks the data source for the objects to display in the list.

 @param listAdapter The list adapter requesting this information.

 @return An array of objects for the list.
 */
- (NSArray<CommonSectionAdapter *> *)objectsForListAdapter:(IGListAdapter *)listAdapter;

/**
 Asks the data source for a section controller for the specified object in the list.

 @param listAdapter The list adapter requesting this information.
 @param sectionAdapter An sectionAdapter in the list.

 @return A new section controller instance that can be displayed in the list.

 @note New section controllers should be initialized here for objects when asked. You may pass any other data to
 the section controller at this time.

 Section controllers are initialized for all objects whenever the `IGListAdapter` is created, updated, or reloaded.
 Section controllers are reused when objects are moved or updated. Maintaining the `-[IGListDiffable diffIdentifier]`
 guarantees this.
 */
- (CommonSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(CommonSectionAdapter *)sectionAdapter;

/**
 Asks the data source for a view to use as the collection view background when the list is empty.

 @param listAdapter The list adapter requesting this information.

 @return A view to use as the collection view background, or `nil` if you don't want a background view.

 @note This method is called every time the list adapter is updated. You are free to return new views every time,
 but for performance reasons you may want to retain the view and return it here. The infra is only responsible for
 adding the background view and maintaining its visibility.
 */
- (nullable UIView *)emptyViewForListAdapter:(IGListAdapter *)listAdapter;

@end
NS_ASSUME_NONNULL_END

#endif /* CoordinatorDataSource_h */
